package apuesta.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.StatelessSession;
import org.hibernate.Transaction;

import com.google.gson.Gson;

import apuesta.dto.ApuestaDto;
import apuesta.dto.ApuestaDto2;
import apuesta.dto.EquipoDto;
import apuesta.dto.EquipoDto2;
import apuesta.dto.EventoDto;
import apuesta.dto.EventoDto2;
import apuesta.hibernate.HibernateFactoryApuesta;
import apuesta.util.Ano;
import apuesta.util.Mes;

public class ApuestaService {
	
	public static int getCountApuestasUsuario(int id_usuario){
		StatelessSession sesion = HibernateFactoryApuesta.getSessionFactory().openStatelessSession();
		int count = 0;
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("select count(*) from t_apuesta where Id_Usuario = "+id_usuario);
			count = Integer.parseInt(query.uniqueResult()+"");
		}catch(Exception ex){
			System.err.println("no se pudo hacer el count: "+ex);
		}finally{
			sesion.close();
		}
		return count;
	}

	public static void	 registrarApuesta(int id_evento, String id_ususario, String id_equipoapuesta, int res_local, int res_visita){
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("insert into t_apuesta (" +
					"`Id_Evento`, `Id_Usuario`, `Fecha_Apuesta`, `Id_EquipoApuesta`, " +
					"`ResultadoLocal_Apuesta`, `ResultadoVisitante_Apuesta`) values (" +id_evento+
					","+id_ususario+",now(),"+id_equipoapuesta+","+res_local+","+res_visita+")");
			query.executeUpdate();
			sesion.flush();
			sesion.clear();
			
		}catch(Exception ex){
			System.err.println("no se pudo hacer el count: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
	}
	
	public static List<ApuestaDto2> apuestasPorMes(int mes, int ano){
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		List<ApuestaDto2> apuestas = null;
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("select * from t_apuesta where MONTH(Fecha_Apuesta) = "+mes+" and YEAR(Fecha_Apuesta)="+ano);
			apuestas = (List<ApuestaDto2>)query.list();
			sesion.flush();
			sesion.clear();
			
		}catch(Exception ex){
			System.err.println("no se pudo hacer el count: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return apuestas;
	}
	
	public static Ano apuestaAno(int ano){
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		Ano a = new Ano();
		List<Mes> meses = new ArrayList<>();
		try{
			for(int i=1; i<13; i++){
				Mes m = new Mes();
				Query query = sesion.createSQLQuery("select * from t_apuesta where MONTH(Fecha_Apuesta) = "+i+" and YEAR(Fecha_Apuesta)="+ano).addEntity("ApuestaDto2", ApuestaDto2.class);;
				m.setId_mes(i);
				//System.out.println("list: "+query.list());
				List l = (List<ApuestaDto2>)query.list();
				for(int j=0; j<l.size(); j++){ 
					ApuestaDto2 ap = (ApuestaDto2) l.get(j);
					ap.setEvento(EventoService.buscar2(ap.getId_evento()));
				}
				
				m.setApuestas(l);
				meses.add(m);
				
			}
			a.setAno(ano);
			a.setMeses(meses);
			
		}catch(Exception ex){
			System.err.println("Error apuesta service: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return a;
	}
	
	public static List<ApuestaDto2> apuestasPorMes2(int mes, int ano){
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		List<ApuestaDto2> apuestas = null;
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("select * from t_apuesta where MONTH(Fecha_Apuesta) = "+mes+" and YEAR(Fecha_Apuesta)="+ano).addEntity("ApuestaDto2", ApuestaDto2.class);
			apuestas = (List<ApuestaDto2>)query.list();
			for(int j=0; j<apuestas.size(); j++){
				ApuestaDto2 ap = (ApuestaDto2) apuestas.get(j);
				ap.setEvento(EventoService.buscar2(ap.getId_evento()));
				ap.setUsuario(UsuarioService.buscar(ap.getId_usuario()));
			}
			sesion.flush();
			sesion.clear();
			
		}catch(Exception ex){
			System.err.println("no se pudo hacer el count: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return apuestas;
	}
	
	public static List<ApuestaDto2> apuestasPorUsuario(String id_usuario){
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		List<ApuestaDto2> apuestas = null;
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("select * from t_apuesta where Id_Usuario = "+id_usuario+" order by Fecha_Apuesta desc").addEntity("ApuestaDto2", ApuestaDto2.class);
			apuestas = (List<ApuestaDto2>)query.list();
			for(int j=0; j<apuestas.size(); j++){
				ApuestaDto2 ap = (ApuestaDto2) apuestas.get(j);
				ap.setEvento(EventoService.buscar2(ap.getId_evento()));
				ap.getEvento().setDisciplina(DisciplinaService.buscar2(ap.getEvento().getId_disciplina()));
				ap.getEvento().setEquipoLocal(EquipoService.buscar2(ap.getEvento().getId_equipoLocal()));
				ap.getEvento().setEquipoVisitante(EquipoService.buscar2(ap.getEvento().getId_equipoVisitante()));
			}
			sesion.flush();
			sesion.clear();
			
		}catch(Exception ex){
			System.err.println("no se pudo hacer el count: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return apuestas;
	}
	
}
